﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//演示_属性(变量)
public class D03_Transform1 : MonoBehaviour
{
    //演示位置属性
    private void Start1()
    {
        Debug.LogFormat("transform.position: {0}", transform.position);
        Debug.LogFormat("transform.localPosition {0}", transform.localPosition);
    }

    //演示旋转
    private void Start2()
    {
        //第一行和第三行是一样的
        Debug.LogFormat("欧拉角:{0}", transform.eulerAngles);
        Debug.LogFormat("(四元数)旋转:{0}", transform.rotation);
        Debug.LogFormat("四元数转欧拉角:{0}", transform.rotation.eulerAngles);
    }

    //演示前后左右方向(在世界坐标系中的表示)
    private void Start3()
    {
        Debug.LogFormat("前方:{0}", transform.forward);
        Debug.LogFormat("上方:{0}", transform.up);
        Debug.LogFormat("右方:{0}", transform.right);
        //可以赋值
        transform.forward = new Vector3(0, 0, 1);
    }

    //注意:如果物体没父物体,根物体就是自己
    private void Start4()
    {
        print(transform.parent);
        print(transform.root);
    }

    //演示子物体数量   和遍历子物体

    //1可以使用for遍历Transform
    private void Start5()
    {
        //拿到主摄像机的transform
        Transform tf = Camera.main.transform;
        //拿到主摄像机的子物体个数
        int count = tf.childCount;

        for (int i = 0; i < count; i++)
        {
            print(tf.GetChild(i).name);
        }
    }
    //2可以使用foreach遍历
    private void Start()
    {
        foreach (Transform item in Camera.main.transform)
        {
            print(item.name);
        }
    }
}
//演示Translate()
public class D03_Transform2 : MonoBehaviour
{
    private void Start1()
    {
        transform.Translate(Vector3.forward);//瞬间y轴位置增加1
    }

    //点一下增加以下位置
    private void Update1()
    {
        if (Input.GetMouseButtonDown(0))
        {
            transform.Translate(Vector3.forward);
        }
    }

    //连续移动
    public float speed = 5f;
    public float rSpeed = 180f;
    private void Update()
    {
        // // transform.Translate(Vector3.forward);//每一帧移动1米

        /*通过按键控制*/

        // if (Input.GetKey(KeyCode.W))
        // {
        //     transform.Translate(Vector3.forward * Time.deltaTime * speed);//每秒移动speed米
        // }
        // if (Input.GetKey(KeyCode.S))
        // {
        //     transform.Translate(Vector3.forward * Time.deltaTime * -speed);//每秒移动speed米
        // }

        /*通过虚拟轴控制*/

        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.forward * Time.deltaTime * speed * v, Space.World);
        float h = Input.GetAxisRaw("Horizontal");
        transform.Rotate(Vector3.up * Time.deltaTime * h * rSpeed, Space.World);
    }
}
//演示RotateAround()
public class D03_Transform : MonoBehaviour
{
    public Transform center;//球体作为中心点
    public float rSpeed = 180;
    private void Update()
    {
        transform.RotateAround(center.position, Vector3.up, rSpeed * Time.deltaTime);
    }
}

//演示找子物体和从子物体中找组件
public class D03_Transform4 : MonoBehaviour
{
    //设置父物体
    private void Start1()
    {
        Camera.main.transform.SetParent(this.transform);//摄像机设置为我的子物体
    }
    //根据索引获取子物体,比如找索引为1的子物体,可以查找被禁用的
    private void Start2()
    {
        Transform tf1 = transform.GetChild(1);//一般只用来遍历
        print(tf1.name);
        tf1.GetComponent<MeshRenderer>().material.color = Color.red;
    }
    //根据名称查找子物体,可以查找被禁用的
    private void Start3()
    {
        //参数可以给名称也可以是路径
        transform.Find("Sphere (2)").GetComponent<MeshRenderer>().material.color = Color.red;
        transform.Find("Sphere (1)/Cylinder/Cylinder (1)")
            .GetComponent<MeshRenderer>().material.color = Color.green;
    }

    //从子物体中获取单个组件,活法获取到被禁用的子物体的组件
    private void Start4()
    {
        //transform.GetComponentInChildren<TestComp>().color = Color.red;
        transform.Find("Sphere (1)/Cylinder/Cylinder (1)")
            .GetComponent<TestComp>().color = Color.red;
    }
    //从子物体获取所有指定类型组件,活法获取到被禁用的子物体的组件
    private void Start()
    {
        TestComp[] testComps = transform.GetComponentsInChildren<TestComp>();
        for (int i = 0; i < testComps.Length; i++)
        {
            testComps[i].color = Color.red;
        }
    }
}

//演示TranformDirction()
public class D03_Transform5 : MonoBehaviour
{
    //首先了解   transfrom.forword,up,right  这几个方向怎么来的

    private void Start1()
    {
        print(transform.forward);
        print(transform.TransformDirection(Vector3.forward));
    }
    //生成要给方块让方块朝着我的右前方
    private void Start()
    {
        //得到自己的右前方(在世界坐标系中的表示)
        Vector3 dir = this.transform.TransformDirection(new Vector3(1, 0, 1));
        print(dir);
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.forward = dir;

        //还有一个 tranform.InverseTransformDirection()  从世界坐标系转到自身坐标系
        Vector3 dir1 = transform.InverseTransformDirection(dir);
        print(dir1);//(1, 0, 1)
    }
}
//演示TranformPoint()
public class D03_Transform6 : MonoBehaviour
{
    //把自身坐标系中的  (3,0,3)   转换到世界坐标系
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 pointInTranfom = new Vector3(3, 0, 3);//自身坐标系中的点
            Vector3 pointInWord = transform.TransformPoint(pointInTranfom);//转换成对应世界坐标系中的点
            GameObject.CreatePrimitive(PrimitiveType.Sphere).transform.position = pointInWord;
        }
    }
}

//演示SetSiblingIndex()  设置在父物体中的索引位置
public class D03_Transform7 : MonoBehaviour
{
    private void Start()
    {
        this.transform.SetSiblingIndex(2);
    }
}
//演示LookAt
public class D03_Transform8 : MonoBehaviour
{
    public Transform lookTarget;

    private void Update()
    {
        transform.LookAt(lookTarget.position);
        transform.Translate(Vector3.forward * Time.deltaTime * 5f);
    }
}